package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IPartitDeQuinielaDao;
import es.gesfutbol.dao.IPenyaDao;
import es.gesfutbol.dao.IPenyistaDao;
import es.gesfutbol.dao.IPronosticDao;
import es.gesfutbol.dao.IQuinielaDao;
import es.gesfutbol.dao.IUsuariRegistratDao;
import es.gesfutbol.domini.implementacio.PartitDeQuiniela;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.domini.implementacio.Pronostic;
import es.gesfutbol.domini.implementacio.Quiniela;
import es.gesfutbol.domini.implementacio.UsuariRegistrat;
import es.gesfutbol.util.OrdenaPenyistesPerId;
import es.gesfutbol.util.PosicioQuinielaComparator;

public class ViewPronosticsController  extends MultiActionController {
	
	private IPenyaDao penyaDao;
	private IPenyistaDao penyistaDao;	
	private IUsuariRegistratDao usuariRegistratDao;
	private IQuinielaDao quinielaDao;
	private IPartitDeQuinielaDao partitDeQuinielaDao;
	private IPronosticDao pronosticDao;
	
	public IPenyistaDao getPenyistaDao() {
		return penyistaDao;
	}

	public void setPenyistaDao(IPenyistaDao penyistaDao) {
		this.penyistaDao = penyistaDao;
	}

	public IUsuariRegistratDao getUsuariRegistratDao() {
		return usuariRegistratDao;
	}

	public void setUsuariRegistratDao(IUsuariRegistratDao usuariRegistratDao) {
		this.usuariRegistratDao = usuariRegistratDao;
	}
	
	public IQuinielaDao getQuinielaDao(){
		return quinielaDao;
	}
	
	public void setQuinielaDao(IQuinielaDao quinielaDao){
		this.quinielaDao = quinielaDao;
	}
	
	public IPartitDeQuinielaDao getPartitDeQuinielaDao(){
		return partitDeQuinielaDao;
	}
	
	public void setPartitDeQuinielaDao(IPartitDeQuinielaDao partitDeQuinielaDao){
		this.partitDeQuinielaDao = partitDeQuinielaDao;
	}
	
	public IPenyaDao getPenyaDao() {
		return penyaDao;
	}

	public void setPenyaDao(IPenyaDao penyaDao) {
		this.penyaDao = penyaDao;
	}
	
	public IPronosticDao getPronosticDao() {
		return pronosticDao;
	}

	public void setPronosticDao(IPronosticDao pronosticDao) {
		this.pronosticDao = pronosticDao;
	}

	public ModelAndView init(HttpServletRequest request,
			HttpServletResponse response)throws Exception{
		
		//Busquem la penya del penyista
		String sAlies = request.getParameter("alies");
		UsuariRegistrat usuari = usuariRegistratDao.findByAlies(sAlies);
		 
		Penyista penyista = penyistaDao.findByIdUsuari(usuari.getIdUsuari());
		penyista = penyistaDao.deproxy(penyista);
		
		Penya penya = penyista.getPenya();
		penya = penyaDao.deproxy(penya);
		
		Set<Penyista> peny = penya.getPenyistes();
		peny = penyistaDao.deproxyPronostics(peny);
		
		Set<Penyista> penyistes = new HashSet<Penyista>(); 
		
		Iterator<Penyista> itPeny = peny.iterator();
		while(itPeny.hasNext()){
			Penyista pe = itPeny.next();
			if(pe.isPronostica())	penyistes.add(pe);
		}
		List<Penyista> penyistes2 = new ArrayList<Penyista>(penyistes);
		Collections.sort(penyistes2, new OrdenaPenyistesPerId());
					
		
		//Busquem la travessa de la jornada
		Quiniela quiniela = quinielaDao.findQuinielaActiva();
		quiniela = quinielaDao.deproxy(quiniela);
		Set<PartitDeQuiniela> partits = quiniela.getPartits();
		List<PartitDeQuiniela> partitsDeQuiniela = new ArrayList<PartitDeQuiniela>(partits);
		partitsDeQuiniela = partitDeQuinielaDao.deproxylist(partitsDeQuiniela);
		Collections.sort(partitsDeQuiniela, new PosicioQuinielaComparator());
		
		//busquem si si hi ha quiniela validada
		Penyista p = penyistaDao.findAdministrador(penya.getIdPenya());
		Iterator<PartitDeQuiniela> itPDQ = partitsDeQuiniela.iterator();
		List<Pronostic> pronValidats = new ArrayList<Pronostic>();
		while(itPDQ.hasNext()){
			PartitDeQuiniela pDQ = itPDQ.next();
			pronValidats.add(pronosticDao.findByPartitQuinielaIAdministrador(pDQ.getIdPartitDeQuiniela(),
					p.getIdPenyista()));			
		}

		Iterator itPronValid = pronValidats.iterator();
		boolean flag = false;
		while(itPronValid.hasNext()){
			if(itPronValid.next() != null){
				flag = true;
			}
		}
		
		if(flag)	pronValidats = pronosticDao.deproxyPDQ(pronValidats);
		
							
		ModelMap model = new ModelMap();
		model.put("penya",penya);
		model.put("quinielaActiva", quiniela);
		model.put("llistatPartits", partitsDeQuiniela);
		model.put("llistatPenyistes", penyistes2);
		model.put("pronosticsValidats", pronValidats);
		return new ModelAndView("usuari/viewPronostics", model);		
	}	
}